// internal/api/auth_controller.go
package api

import (
	"net/http"

	"github.com/gin-gonic/gin"

	"github.com/jfastfiler/internal/service"
)

type AuthController struct {
	authService *service.AuthService
}

func NewAuthController(authService *service.AuthService) *AuthController {
	return &AuthController{authService: authService}
}

// Login 用户登录
// @Summary 用户登录
// @Description 用户登录接口
// @Tags 认证
// @Accept json
// @Produce json
// @Param login body service.LoginRequest true "登录信息"
// @Success 200 {object} service.LoginResponse
// @Router /api/v1/auth/login [post]
func (c *AuthController) Login(ctx *gin.Context) {
	var req service.LoginRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ip := ctx.ClientIP()
	userAgent := ctx.GetHeader("User-Agent")
	resp, err := c.authService.Login(&req, ip, userAgent)
	if err != nil {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, resp)
}

// RefreshToken 刷新Token
// @Summary 刷新Token
// @Description 刷新JWT Token
// @Tags 认证
// @Accept json
// @Produce json
// @Security Bearer
// @Success 200 {object} service.LoginResponse
// @Router /api/v1/auth/refresh [post]
func (c *AuthController) RefreshToken(ctx *gin.Context) {
	token := ctx.GetHeader("Authorization")
	if len(token) < 7 {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": "未提供Token"})
		return
	}

	token = token[7:] // 去掉 "Bearer " 前缀

	resp, err := c.authService.RefreshToken(token)
	if err != nil {
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, resp)
}

// ChangePassword 修改密码
// @Summary 修改密码
// @Description 用户修改自己的密码
// @Tags 认证
// @Accept json
// @Produce json
// @Security Bearer
// @Param changePass body service.ChangePasswordRequest true "密码信息"
// @Success 200 {object} gin.H
// @Router /api/v1/auth/change-password [post]
func (c *AuthController) ChangePassword(ctx *gin.Context) {
	var req service.ChangePasswordRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	userID := ctx.GetInt("user_id")
	err := c.authService.ChangePassword(userID, req.OldPassword, req.NewPassword)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"message": "密码修改成功"})
}